﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using MoroMoro.Samples.ToDoList.Base.Application;
using MoroMoro.Samples.ToDoList.Presentation.Views;

namespace MoroMoro.Samples.ToDoList.Presentation.Presenters
{
    /// <summary>
    /// プレゼンターを表します。
    /// </summary>
    /// <typeparam name="TView">ビューの型。</typeparam>
    public abstract class Presenter<TView>
        where TView : IView
    {
        /// <summary>
        /// <see cref="Presenter&lt;TView&gt;"/> クラスの新しいインスタンスを初期化します。
        /// </summary>
        /// <param name="view">ビュー。</param>
        /// <exception cref="System.ArgumentNullException">view が null です。</exception>
        public Presenter(TView view)
        {
            if (view == null)
            {
                throw new ArgumentNullException("view");
            }
            _view = view;
            _view.Load += OnLoad;
            _view.Closing += OnClosing;
        }


        /// <summary>
        /// ビュー。
        /// </summary>
        private readonly TView _view;


        /// <summary>
        /// ビューを取得します。
        /// </summary>
        protected TView View
        {
            get
            {
                return _view;
            }
        }


        /// <summary>
        /// イベントハンドラを登録します。
        /// </summary>
        protected virtual void RegisterEventHandlers()
        {
        }

        /// <summary>
        /// ビューがロードされた時の処理を行います。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void OnLoad(object sender, EventArgs e)
        {
            RegisterEventHandlers();
        }

        /// <summary>
        /// ビューが閉じる時の処理を行います。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void OnClosing(object sender, CancelEventArgs e)
        {
        }
    }
}
